package com.hxqc.basic.common;

import java.io.IOException;
import java.util.List;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.safety.Whitelist;
import org.jsoup.select.Elements;
import org.junit.Assert;
import org.junit.Test;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlButton;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlStrong;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;

public class TaoBaoUtils {
	
    @Test
    public void HtmlUnitBaiduAdvanceSearch() {
        try {
            // 得到浏览器对象，直接New一个就能得到，现在就好比说你得到了一个浏览器了
            WebClient webclient = new WebClient();
 
            // 这里是配置一下不加载css和javaScript,配置起来很简单，是不是
            webclient.getOptions().setCssEnabled(false);
            webclient.getOptions().setJavaScriptEnabled(false);
            
            
            // 做的第一件事，去拿到这个网页，只需要调用getPage这个方法即可
            HtmlPage htmlpage = webclient
                    .getPage("http://news.baidu.com/advanced_news.html");
 
            // 根据名字得到一个表单，查看上面这个网页的源代码可以发现表单的名字叫“f”
            final HtmlForm form = htmlpage.getFormByName("f");
            System.out.println(form);
            // 同样道理，获取”百度一下“这个按钮
            final HtmlSubmitInput button = form.getInputByValue("百度一下");
            System.out.println(button);
            // 得到搜索框
            final HtmlTextInput textField = form.getInputByName("q1");
 
            System.out.println(textField);
 
            // 最近周星驰比较火呀，我这里设置一下在搜索框内填入”周星驰“
            textField.setValueAttribute("周星驰");
            // 输入好了，我们点一下这个按钮
            final HtmlPage nextPage = button.click();
            // 我把结果转成String
            System.out.println(nextPage);

            String result = nextPage.asXml();
 
            System.out.println(result);
        } catch (Exception e) {
 
            e.printStackTrace();
        }
 
    }
    /**
     * 搜索淘宝商品价格
     * @param itemName 商品名称 
     * @return  Integer类型的价钱（元为单位）
     */
    public static Integer taobaoAdvanceSearch(String itemName) {
    	Integer price = 0;
        try {
        	WebClient webclient = new WebClient();
            webclient.getOptions().setCssEnabled(false);
            webclient.getOptions().setJavaScriptEnabled(true);
 
            webclient.getOptions().setRedirectEnabled(true);
            HtmlPage htmlpage = webclient
                    .getPage("http://www.taobao.com");
            webclient.waitForBackgroundJavaScript(10000);
            final HtmlForm form = htmlpage.getFormByName("search");
            final HtmlButton button1 = (HtmlButton)htmlpage.getByXPath("//button").get(0);
            final HtmlTextInput textField = form.getInputByName("q");
 
            textField.setValueAttribute(itemName);
            final HtmlPage nextPage = button1.click();
            // 等待JS驱动dom完成获得还原后的网页
            webclient.waitForBackgroundJavaScript(10000);
            
            
            List strongs = nextPage.getByXPath("//div[@class='col first']/a/span/strong");
            for(int i = 0 ; i < strongs.size() ; i++){
            	HtmlStrong strong = (HtmlStrong)strongs.get(i);
            	price = strong.asText() == null ? 0 : Integer.parseInt(strong.asText());
            }

            System.out.println("淘宝网搜索到的价格是 : " + price);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return price;
    }
    
//    public static void main(String[] args) {
//		System.out.println(taobaoAdvanceSearch("iphone7"));
//	}
    @Test
    public void jsoupParse() {
 
        try {
            /** HtmlUnit请求web页面 */
            // 模拟chorme浏览器，其他浏览器请修改BrowserVersion.后面
            WebClient wc = new WebClient(BrowserVersion.CHROME);
 
            wc.getOptions().setJavaScriptEnabled(true); // 启用JS解释器，默认为true
            wc.getOptions().setCssEnabled(false); // 禁用css支持
            wc.getOptions().setThrowExceptionOnScriptError(false); // js运行错误时，是否抛出异常
            wc.getOptions().setTimeout(10000); // 设置连接超时时间 ，这里是10S。如果为0，则无限期等待
            HtmlPage page = wc.getPage("http://passport.tianya.cn/login.jsp");
            String pageXml = page.asXml(); // 以xml的形式获取响应文本
            // text只会获取里面的文本,网页html标签和script脚本会被去掉
            String pageText = page.asText();
            System.out.println(pageText);
 
            // 方法一，通过get方法获取
            HtmlButton submit = (HtmlButton) page.getElementById("loginBtn");
 
            // 方法二，通过XPath获取，XPath通常用于无法通过Id搜索，或者需要更为复杂的搜索时
            HtmlDivision div = (HtmlDivision) page.getByXPath("//div").get(0);
 
            // 网络爬虫中主要目的就是获取页面中所有的链接
 
            java.util.List<HtmlAnchor> achList = page.getAnchors();
            for (HtmlAnchor ach : achList) {
                System.out.println(ach.getHrefAttribute());
            }
 
            System.out.println("-------jsoup部分------");
            // 服务器端进行校验并清除有害的HTML代码,防止富文本提交有害代码
            Jsoup.clean(pageXml, Whitelist.basic());
            /** jsoup解析文档 */
            // 把String转化成document格式
            Document doc = Jsoup.parse(pageXml);
            Element loginBtn = doc.select("#loginBtn").get(0);
            System.out.println(loginBtn.text());
            Assert.assertTrue(loginBtn.text().contains("登录"));
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    @Test
    public void jsoupCrawl() throws IOException {
 
        String url = "http://s.taobao.com/search?q=iphone7&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.50862.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170215&app=detailproduct&through=1";
        Connection con = Jsoup.connect(url);// 获取请求连接
        // 浏览器可接受的MIME类型。
        con.header("Accept",
                "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        con.header("Accept-Encoding", "gzip, deflate");
        con.header("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
        con.header("Connection", "keep-alive");
        con.header("Host", url);
        con.header("User-Agent",
                "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0");
        Document doc = con.get();
        Elements loginBtn = doc.select("body");
        System.out.println(loginBtn.text());// 获取节点中的文本，类似于js中的方法
    }
}
